package com.rzl.expense.framework.aspectj;

import com.rzl.expense.common.annotation.DataScope;
import com.rzl.expense.common.core.domain.BaseEntity;
import com.rzl.expense.common.core.domain.entity.SysRegion;
import com.rzl.expense.common.core.domain.entity.SysRole;
import com.rzl.expense.common.core.domain.entity.SysUser;
import com.rzl.expense.common.core.domain.model.LoginUser;
import com.rzl.expense.common.core.text.Convert;
import com.rzl.expense.common.utils.SecurityUtils;
import com.rzl.expense.common.utils.StringUtils;
import com.rzl.expense.common.utils.spring.SpringUtils;
import com.rzl.expense.framework.security.context.PermissionContextHolder;
import com.rzl.expense.system.mapper.SysRegionMapper;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 数据过滤处理
 *
 * @author expense
 */
@Aspect
@Component
public class ContractScopeAspect {
    /**
     * 全部数据权限
     */
    public static final String DATA_SCOPE_ALL = "1";

    /**
     * 自定数据权限
     */
    public static final String DATA_SCOPE_CUSTOM = "2";

    /**
     * 地市数据权限
     */
    public static final String DATA_SCOPE_CITY = "3";

    /**
     * 地市及以下数据权限
     */
    public static final String DATA_SCOPE_COUNTY = "4";

    /**
     * 仅本人数据权限
     */
    public static final String DATA_SCOPE_SELF = "5";

    /**
     * 数据权限过滤关键字
     */
    public static final String DATA_SCOPE = "dataScope";

    public static String dataScopeFilter() {
        StringBuilder sqlString = new StringBuilder();
        SysUser sysUser = SecurityUtils.getLoginUser().getUser();

        for (SysRole role : sysUser.getRoles()) {
            String dataScope = role.getDataScope();

            if (DATA_SCOPE_ALL.equals(dataScope)) {
                sqlString = new StringBuilder();
                break;
            } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { // 自定义数据权限
                sqlString.append(StringUtils.format(
                        " OR {}.preg_id IN ( SELECT reg_id FROM sys_role_region WHERE role_id = {} ) OR {}.reg_id IN ( SELECT reg_id FROM sys_role_region WHERE role_id = {} ) ", "dc",
                        role.getRoleId(), "dc", role.getRoleId()));
                sqlString.append(StringUtils.format(" OR {}.create_user = '{}' ", "dc", sysUser.getUserName()));
            } else if (DATA_SCOPE_CITY.equals(dataScope)) { // 地市数据权限
//                sqlString.append(StringUtils.format(" OR {}.preg_id = '{}' OR {}.reg_id = '{}' ", "dc", sysUser.getRegId(), "dc", sysUser.getRegId()));
//                sqlString.append(StringUtils.format(
//                        " OR {}.reg_id IN ( SELECT reg_id FROM sys_region WHERE reg_id = '{}' or find_in_set( '{}' , ancestors ) )", "dc", sysUser.getRegId(), sysUser.getRegId()));
//                sqlString.append(StringUtils.format(" OR {}.create_user = '{}' ", "dc", sysUser.getUserName()));

                SysRegionMapper regionMapper = SpringUtils.getBean(SysRegionMapper.class);
                int hasChild = regionMapper.hasChildByRegionId(sysUser.getRegId());
                if (hasChild > 0) {
                    sqlString.append(StringUtils.format(
                            " OR {}.reg_id IN ( SELECT reg_id FROM sys_region WHERE reg_id = '{}' or find_in_set( '{}' , ancestors ) )", "dc", sysUser.getRegId(), sysUser.getRegId()));
                    sqlString.append(StringUtils.format(" OR {}.create_user = '{}' ", "dc", sysUser.getUserName()));
                } else {
                    SysRegion sysRegion = regionMapper.selectRegionById(sysUser.getRegId());
                    sqlString.append(StringUtils.format(
                            " OR {}.reg_id IN ( SELECT reg_id FROM sys_region WHERE reg_id = '{}' or find_in_set( '{}' , ancestors ) )", "dc", sysRegion.getRegId(), sysRegion.getRegId()));
                    sqlString.append(StringUtils.format(" OR {}.create_user = '{}' ", "dc", sysUser.getUserName()));
                }


            } else if (DATA_SCOPE_COUNTY.equals(dataScope)) { // 地市及以下数据权限
                sqlString.append(StringUtils.format(
                        " OR {}.reg_id = '{}'", "dc", sysUser.getRegId()));
                sqlString.append(StringUtils.format(" OR {}.create_user = '{}' ", "dc", sysUser.getUserName()));
            } else if (DATA_SCOPE_SELF.equals(dataScope)) {// 仅本人数据权限
                sqlString.append(StringUtils.format(" OR {}.create_user = '{}' ", "dc", sysUser.getUserName()));
            }
        }
        if (StringUtils.isNotEmpty(sqlString)) {
            return " AND (" + sqlString.substring(4) + ")";
        }
        return "";
    }

}
